package br.com.JZSolution.domineduplex;

import java.io.File;
import java.net.BindException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JTextField;

import br.com.JZSolution.domineduplex.controle.ControladorDePreferencias;
import br.com.JZSolution.domineduplex.controle.ControladorDeUsuario;
import br.com.JZSolution.domineduplex.gui.MainFrame;
import br.com.JZSolution.domineduplex.gui.images.LeitorDeImagem;
import br.com.JZSolution.domineduplex.gui.util.ComunicadorDeMensagens;
import br.com.JZSolution.domineduplex.modelo.Transferencia;
import br.com.JZSolution.domineduplex.rede.ControladorDeServidor;
import br.com.JZSolution.domineduplex.utils.SwingUtils;
import br.com.JZSolution.domineduplexserver.modelo.Usuario;

public class DomineDuplex {
	private static MainFrame mainframe;
	private static DomineDuplex instance;
	private static List<JComponent> listaComponentesLembrados;
	
	private static String nomeUsuario;
	private static String diretorioDeRecepcao;
	private static int portaDeRecepcao;
	private Usuario usuarioAutenticado;
	
	private ImageIcon iconConectado = LeitorDeImagem.getInstance().carregarImagem("Conectado.png");     
	private ImageIcon iconDesconectado = LeitorDeImagem.getInstance().carregarImagem("Desconectado.png");
	
	private static String ultimoPath;
	public static final String SERVIDOR_LOCAL = "http://localhost:8080/Server/usuario/";
	//public static final String SERVIDOR = "http://domineduplex.mine.nu:8080/DomineDuplexServer/";
	public static final String SERVIDOR= "http://192.168.0.187:8080/DomineDuplexServer/";
	
	public static void main(String[] args) {
		SwingUtils.traduzirBR();
		SwingUtils.fonteBold();
		SwingUtils.setNimbusLAF();
		SwingUtils.setProgressUP();	
		listaComponentesLembrados = new ArrayList<JComponent>();
		mainframe = new MainFrame();
		restaurarConfiguracoes();
		mainframe.setVisible(true);
		carregarContatos();
	}
	
	private static void carregarContatos(){
		String resp = ControladorDeUsuario.getInstance().autenticarUsuario();
		if(!resp.equals("ok")){
			ComunicadorDeMensagens.erro(resp);
		}
	}
	public MainFrame getMainframe() {
		return mainframe;
	}
	
	public void setMainframe(MainFrame mainframe) {
		DomineDuplex.mainframe = mainframe;
	}
	
	public void salvarPreferencias(){
		ControladorDePreferencias controle = ControladorDePreferencias.getInstance();
		Iterator<JComponent> it = listaComponentesLembrados.iterator();
		JTextField jTextField;
		while(it.hasNext()){
			jTextField = (JTextField)it.next();
			controle.setPropriedade(jTextField.getName(), jTextField.getText());
		}
		
		controle.setPropriedade(ControladorDePreferencias.ULTIMOPATH, ultimoPath);
		controle.salvarPreferencias();
	}
	
	public static void restaurarConfiguracoes(){
		ControladorDePreferencias controle = ControladorDePreferencias.getInstance();
		Iterator<JComponent> it = listaComponentesLembrados.iterator();
		JTextField jTextField;
		while(it.hasNext()){
			jTextField = (JTextField)it.next();
			jTextField.setText(controle.getPropriedade(jTextField.getName()));
		}
		String porta = controle.getPropriedade(ControladorDePreferencias.PORTA);
		if(porta != null){
			portaDeRecepcao = Integer.parseInt(porta);
		}	
		diretorioDeRecepcao = controle.getPropriedade(ControladorDePreferencias.PASTA);
		nomeUsuario = controle.getPropriedade(ControladorDePreferencias.USUARIO);
		ultimoPath = controle.getPropriedade(ControladorDePreferencias.ULTIMOPATH);
	}

	public void addComponenteLembrado(JComponent com){
		listaComponentesLembrados.add(com);
	}
	
	public List<JComponent> getComponentesLembrados() {
		return listaComponentesLembrados;
	}
	public void setComponentesLembrados(List<JComponent> componentesLembrados) {
		DomineDuplex.listaComponentesLembrados = componentesLembrados;
	}
	
	
	public String getDiretorioDeConfiguracao() {
		String diretorioDeEntrada = System.getProperty("user.home");
		if (!diretorioDeEntrada.endsWith("/") && !diretorioDeEntrada.endsWith("\\"))
			diretorioDeEntrada = diretorioDeEntrada + File.separatorChar; 
		return diretorioDeEntrada;	
	}
	
	public String getDiretorioDeRecepcao() {
		return diretorioDeRecepcao;
	}
	public int getPortaDeRecepcao() {
		return portaDeRecepcao;
	}
	public void setDiretorioDeRecepcao(String diretorioDeRecepcao) {
		DomineDuplex.diretorioDeRecepcao = diretorioDeRecepcao;
	}
	public void setPortaDeRecepcao(int portaDeRecepcao) {
		DomineDuplex.portaDeRecepcao = portaDeRecepcao;
	}
	
	public void avisarFimDeTransferencia(Transferencia transf){
		//
	}
	
	public static DomineDuplex getInstance(){
		if(instance == null)
			instance = new DomineDuplex();
		return instance;
	}

	public void setUsuario(String usuario) {
		DomineDuplex.nomeUsuario = usuario;		
	}
	public String getUsuario(){
		return nomeUsuario;
	}
	public static String getUltimoPath() {
		return ultimoPath;
	}
	public static void setUltimoPath(String ultimoPath) {
		DomineDuplex.ultimoPath = ultimoPath;
	}
	
	/**
	 * Retorna o usuario server autenticado, com a lista de contatos, com todos os dados preenchidos
	 */
	public Usuario getUsuarioAutenticado() {
		return usuarioAutenticado;
	}
	public void setUsuarioAutenticado(Usuario usuarioAutenticado) {
		this.usuarioAutenticado = usuarioAutenticado;
	}

	public void conectarDesconectar() {
		
		JButton butConectar = mainframe.getPainelDeBotoes().getButConectar();
		
		if(ControladorDeServidor.isConectado()){
			Thread t = new Thread(){
				public void run(){
					ControladorDeServidor.desconectar();					
				}
			};
			t.start();
			butConectar.setToolTipText("Conectar");
			butConectar.setIcon(iconDesconectado);
			DomineDuplex.getInstance().getMainframe().getStatusLbl().setText(" Desconectado");
		}else{
			ControladorDeServidor.setConectando(true);
			Thread t = new Thread(){
				public void run(){
					try{
						ControladorDeServidor.Conectar();
					}catch (BindException e) {
						e.printStackTrace();
						ComunicadorDeMensagens.erro("A porta de recepção "+ DomineDuplex.getInstance().getPortaDeRecepcao() +" já está em uso por outro programa, tente outra porta!"
								, "Erro ao conectar");
					}catch (Exception e2) {
						e2.printStackTrace();
						ComunicadorDeMensagens.erro("Erro ao conectar");
					}
				}
			};
			t.start();
			
			while(ControladorDeServidor.isConectando()){
				//Espera o processo de conexao do servidor
				try {
					Thread.sleep(100);
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
			}
			
			if(ControladorDeServidor.isConectado()){
				butConectar.setToolTipText("Desconectar");
				butConectar.setIcon(iconConectado);
				DomineDuplex.getInstance().getMainframe().getStatusLbl().setText(" Conectado");
			}
		}	
		
	}
}
